'''
Author: HowsenFisher
Date: 2021-04-08 12:33:34
LastEditTime: 2021-04-11 11:51:12
LastEditors: liutq
Description: 文件监视模块
FilePath: \子网传输\FileTools\FolderWatcher.py
'''
import time
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler,FileSystemEventHandler
from Config import conf
from sql.AdminDB import *
from FileTools.FileStat import *

class Watcher(FileSystemEventHandler):
    '''
    @description: 文件监视事件类
    @param  {*}
    @return {*}
    @param {*} self
    @param {*} parent：父对象
    '''
    def __init__(self,parent):
        super(Watcher, self).__init__()
        self.parent = parent
    '''
    @description: 文件创建触发函数
    @param  {*}
    @return {*}
    @param {*} self
    @param {*} event：事件对象
    '''
    def on_created(self,event):
        # 向GUI递交数据
        self.parent.newInfoSignal.emit(f"{event.src_path} 被创建")
        type=""
        # 根据文件类型生成info
        if os.path.isdir(event.src_path):
            type="dir"
        else:
            type="file"
        info = {"filepath":event.src_path,"owner":conf.ip,"ConfigTime":FileStat(event.src_path).getStat()["最后一次修改时间"],"type":type}
        # 添加文件信息到数据库
        insertFile(info)

    '''
    @description: 文件删除出发函数
    @param  {*}
    @return {*}
    @param {*} self
    @param {*} event：事件对象
    '''
    def on_deleted(self,event):
        # 向GUI递交数据
        self.parent.newInfoSignal.emit(f"{event.src_path} 被删除")
        # 生成info数据
        info={"filepath":event.src_path,"owner":conf.ip}
        # 从数据库删除文件信息
        deleteFile(info)
        
    
    '''
    @description: 文件变动触发函数
    @param  {*}
    @return {*}
    @param {*} self
    @param {*} event：事件对象
    '''
    def on_modified(self,event):
        # 向GUI递交数据
        self.parent.newInfoSignal.emit(f"{event.src_path} 被修改")
        # 生成info数据
        info={"filepath":event.src_path,"owner":conf.ip,"ConfigTime":FileStat(event.src_path).getStat()["最后一次修改时间"]}
        # 更新数据库文件修改时间
        updateFile(info)

    '''
    @description: 文件移动触发函数
    @param  {*}
    @return {*}
    @param {*} self
    @param {*} ：事件对象
    '''
    def on_moved(self,event):
        # 向GUI递交数据
        self.parent.newInfoSignal.emit(f"{event.src_path} 被移动到 {event.dest_path}")
        # 生成info数据
        info={"oldfilepath":event.src_path,"newfilepath":event.dest_path,"owner":conf.ip}
        # 更新数据库filepath字段
        moveFile(info)
    
    def gci(self,filepath):
        # 遍历filepath下所有文件，包括子目录
        files = os.listdir(filepath)
        for fi in files:
            fi_d = os.path.join(filepath, fi)
            if os.path.isdir(fi_d):
                print(fi_d)
                self.gci(fi_d)
            else:
                print(fi_d)

class FolderWatcher:
    '''
    @description: 文件夹监视类
    @param  {*}
    @return {*}
    @param {*} self
    @param {*} parent：父对象
    @param {*} watch_dir：要监视的文件夹
    '''
    def __init__(self,parent,watch_dir):
        # 父对象
        self.parent = parent
        self.watch_dir = watch_dir
        self.parent.FolderWatcherObj = self
        # 向GUI递交数据
        self.parent.newInfoSignal.emit("文件夹变动监听器初始化")
        # 开启文件监视
        self.event_handler = Watcher(self.parent)
        self.observer = Observer()
        self.observer.schedule(self.event_handler, path=self.watch_dir, recursive=True)  # recursive递归的
        self.observer.start()
    
    def stop(self):
        self.observer.stop()
        # self.observer = None
    
    def start(self):
        self.observer = Observer()
        self.observer.schedule(self.event_handler, path=self.watch_dir, recursive=True)  # recursive递归的
        self.observer.start()